calculate_distance_matrix Subroutine

public subroutine calculate_distance_matrix(coordinates, distance_matrix, grid_type, toroidal)

Subroutine to calculate the distance between the units inside a kohonen layer

Type Bound

two_level_self_organizing_map

Arguments

Type IntentOptional Attributes Name
real(kind=wp), intent(inout), dimension(:,:) :: coordinates

A real array

real(kind=wp), intent(inout), dimension(:,:) :: distance_matrix

A real array

character(len=*) :: grid_type

A character varaible

logical :: toroidal

A logical variableS


Called by

proc~~calculate_distance_matrix~2~~CalledByGraph proc~calculate_distance_matrix~2 two_level_self_organizing_map%calculate_distance_matrix proc~create_2lsom two_level_self_organizing_map%create_2lsom proc~create_2lsom->proc~calculate_distance_matrix~2 proc~read_som_layer two_level_self_organizing_map%read_som_layer proc~read_som_layer->proc~calculate_distance_matrix~2 proc~train_two_level_som train_two_level_som proc~train_two_level_som->proc~create_2lsom

Variables

Type Visibility Attributes Name Initial
integer, public :: i
integer, public :: j
real(kind=wp), public :: maxdiffx
real(kind=wp), public :: maxdiffy
real(kind=wp), public :: maxdiffz
real(kind=wp), public, dimension(3) :: diffs

Source Code

   subroutine calculate_distance_matrix(coordinates,distance_matrix,grid_type,toroidal)
   !========================================================================================
!! Subroutine to calculate the distance between the units inside a kohonen layer  
   real(kind=wp),dimension(:,:),intent(inout) :: coordinates
!! A real array
   real(kind=wp),dimension(:,:),intent(inout) :: distance_matrix
!! A real array
   character(len=*) :: grid_type
!! A character varaible
   logical :: toroidal
!! A logical variableS
   integer :: i,j
   real(kind=wp) :: maxdiffx,maxdiffy,maxdiffz
   real(kind=wp),dimension(3) :: diffs
   !
   maxdiffx=maxval(coordinates(:,1))/2.0_wp;
   maxdiffy=maxval(coordinates(:,2))/2.0_wp;
   maxdiffz=maxval(coordinates(:,3))/2.0_wp;
   !
   if(toroidal) then
      do i=1,size(distance_matrix,1)
         do j=i+1,size(distance_matrix,2)
            diffs=abs(coordinates(j,1:3) - coordinates(i,1:3));
            if (diffs(1) > maxdiffx) diffs(1)=2.0_wp*maxdiffx - diffs(1);
            if (diffs(2) > maxdiffy) diffs(2)=2.0_wp*maxdiffy - diffs(2);
            !if (diffs(3) > maxdiffy) diffs(3)=2*maxdiffz - diffs(3);
            if (trim(grid_type) .eq. "hexagonal") then 
                  distance_matrix(i,j)= sum(diffs**2);
            elseif(trim(grid_type) .eq. "rectangular") then !rectangular 
                  distance_matrix(i,j)=maxval(diffs);
            endif
         enddo
      enddo
   else
      do i=1,size(distance_matrix,1)
         do j=i+1,size(distance_matrix,2)
            diffs=abs(coordinates(j,1:3) - coordinates(i,1:3));
            distance_matrix(i,j)=dsqrt(sum(diffs**2));
         enddo
      enddo   
   endif
   !
   distance_matrix=distance_matrix + transpose(distance_matrix);
   !write(*,'(49f10.4)') distance_matrix(1,:)
   !
   end subroutine calculate_distance_matrix